/*
 * @Author: Admin zhaojihai2012@163.com
 * @Date: 2024-01-29 11:31:48
 * @LastEditors: Admin zhaojihai2012@163.com
 * @LastEditTime: 2024-02-14 10:33:52
 * @FilePath: \kd686-esp32s3-can\components\kd686bsp\ec_bsp_key.h
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
/******************************************************************************
 ** 文件名称： bsp_key.h
 ** 模块名称： 通用按键模块
 ** 版 本 号： V1.0
 ** 作    者： PLAY
 ** 用    法： 1.修改用于读取引脚状态的宏定义
 **            2.实现Key_GpioInit()函数，用于引脚初始化
 **            3.调用bsp_Key_Init()函数进行初始化，该函数会调用Key_GpioInit()
 **            4.周期性调用Key_Scan()函数进行按键扫描，调用周期建议20ms
 **            5.需要按键时，用Key_GetKeyValue()函数返回键值
 ** 修改记录： 版本     修改人      时间         修改内容
 **
 ******************************************************************************/
#ifndef __EC_BSP_KEY_H
#define __EC_BSP_KEY_H

/******************************************************************************
 * 头文件
 ******************************************************************************/
#include "driver/gpio.h"
#include "esp_timer.h"
#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
#include "kd686_bsp.h"

#define __weak __attribute__((weak))
//逻辑相关
#define KEY_NUM_MAX					6		/*定义按键最大数目，目前没用。程序限定最大支持6*/
#define KEY_LEVEL					0x00	/*定义按键的有效电平。0-低电平有效，1-高电平有效*/
#define KEY_SCAN_TIME				20		/*定义按键扫描的周期（ms）*/
#define KEY_LONG_PERIOD				1000	/*定义按键长按的识别时间。最小1个扫描周期，单位ms*/
#define KEY_CONTINUE_PERIOD			300		/*定义连发键的间隔时间。最小1个扫描周期，单位ms*/
#define KEY_WOBBLE_PERIOD			40		/*消抖期时间，最小1个扫描周期，单位ms*/

//定义按键对应的GPIO管脚,硬件相关
#define GPIO_KEY_1             18
#define GPIO_KEY_2             17
#define GPIO_KEY_3             19
#define GPIO_KEY_4             20

/*定义按键键值*/
#define KEY_NULL					0x00
#define KEY_VALUE_1					0x01
#define KEY_VALUE_2					0x02
#define KEY_VALUE_3					0x04
#define KEY_VALUE_4					0x08
#define KEY_VALUE_5					0x10
#define KEY_VALUE_6					0x20   /*R*/
#define KEY_VALUE_7					0x40   /*L*/

//定义按键返回值状态(按下,长按,连_发,释放)
#define KEY_PRESS					0x000
#define KEY_LONG					0x800
#define KEY_CONTINUE				0xC00
#define KEY_RELEASE					0x400
#define KEY_CONTINUE_RELEASE		0x200
typedef enum
{
    EC_UP_KEY = 0x00,        //上键
    EC_DOWN_KEY,             //下键
    EC_POWER_KEY,            //电源键
    EC_BUTTON_MAX,           //不会产生按键
    EC_MODE_KEY,             //I键
    EC_LIGHT_KEY,            //大灯键
    EC_BUTTON_5,
    EC_BUTTON_6,
} ec_button_t;


void ec_bsp_key_init(void);
void ec_bsp_key_event_cb(uint8_t (*pFunc)(void *arg));
void ec_bsp_key_read_gpio(void);
#endif

